package com.fy.tt.entity;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Id;
import javax.persistence.Table;

import com.fy.toolhelper.db.IBaseDao;
import com.fy.tt.constant.TemplateConstants.SomeConstant;

/**
 * 示例实体
 * 1.这些注解标记不具备自动建表功能, 主要为数据库查询结果映射为实体对象实例提供映射信息, 所以请手工建表.
 * 2.同时像@ManyToOne这种外键的注解也没有对应实现, 如果需要在实体中拓展出另一个关联实体, 需要配合{@link IBaseDao #extend(java.sql.Connection, java.util.List, String[], IBaseDao[])}进行处理.
 * 3.建议将实体作为接口结果直接返回, 不需要中间DTO和VO, 如果工具不复杂的话.
 */
@Table(name = "template_entity")
public class TemplateEntity implements Serializable {
	private static final long serialVersionUID = -6061972293805592493L;

	/*
	 * 所有字段都使用类类型, 不要使用基本类型, 这样更能满足可以为null这种语义的情况
	 * 数据库注解只能放在字段上, 请注意, 放在GETTER方法上的还没有支持
	 */
	/**
	 * 主键
	 */
	@Id
	@Column(name = "id")
	private Long/* 支持Integer, String, Long */ id;
	
	/**
	 * 普通字段
	 */
	@Column(name = "normal_column")
	private String/*支持Integer, String, Long, Float, Double, BigDecimal*/ normalColumn;
	
	/**
	 * 枚举量字段
	 */
	@Column(name = "enum_column")
	private SomeConstant enumColumn; /* 在映射处理时会自动转换类型, 数据库中存储的是Integer */
	
	/**
	 * 枚举量字段
	 */
	@Column(name = "blob_column")
	private byte[] blobColumn; /* 和普通的Sql封装处理一样, 没有懒加载功能, 可以使用InputStream */

	/**
	 * 拓展的实体对象, 不属于表结构的一部分, 添加数据库注解无效.
	 * 如果是对应着某个外键字段, 则仍然需要在上面定义好该外键字段的实体属性并配置好注解.
	 * 调用{@link IBaseDao #extend(java.sql.Connection, java.util.List, String[], IBaseDao[])}进行基础的查询和填充该属性实例.
	 * 或者开发者可以自己定义和实现填充实例.
	 * 只能拓展一层, 多层需要开发者多次调用拓展实现.
	 */
	private TemplateEntity extendEntity;
	
	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getNormalColumn() {
		return normalColumn;
	}

	public void setNormalColumn(String normalColumn) {
		this.normalColumn = normalColumn;
	}

	public SomeConstant getEnumColumn() {
		return enumColumn;
	}

	public void setEnumColumn(SomeConstant enumColumn) {
		this.enumColumn = enumColumn;
	}

	public byte[] getBlobColumn() {
		return blobColumn;
	}

	public void setBlobColumn(byte[] blobColumn) {
		this.blobColumn = blobColumn;
	}

	public TemplateEntity getExtendEntity() {
		return extendEntity;
	}

	public void setExtendEntity(TemplateEntity extendEntity) {
		this.extendEntity = extendEntity;
	}
}
